from spk.core.workspace import *

class StepApiRequest(SpkWorker):

    '''基于 reqeusts 的 api 测试

    一个简单的工作流
    1. 提供一个 http 地址
    2. 查看 http 请求结果
    '''

    # 这里设定插件的步骤名称
    First = "第一步，提供一个 http 地址"
    Second = "第二步，查看 http 请求结果"

    # 这里设定插件的步骤组，提供给框架加载
    __steps__ = [
        First, Second
    ]

    # 这里是插件里的使用的缓存状态，这里是用于框架清空状态时用的
    __keywords__ = [
        'api-request-url',      # 这是 第一步 缓存输入的状态
        'api-request-done',     # 这是 第二步 检查点状态
                                    # 第二步第一次进入时，还没有请求接口
                                    # 请求完接口时，设置为 True，重载后显示结果面板
        'api-request-response', # 这是 第二步 请求结果的状态，在步骤里设置的是 response
    ]

    def __do_work__(self):

        if current() == self.First:
            url = st.text_input('请输入一个 http 地址', '')
            
            if url:
                set('api-request-url', url)

            if get('api-request-url') is not None:
                # 清除第二步的检查点，为了总是请求而写上的
                unset('api-request-done')
                    # 如果只是切换面板，则注释掉它，由侧边控制面板来完成
                    # 例如第二步有个侧边按钮为 ‘重新请求’ 来
                    # 清除这个检查点，并重载面板自动请求新的结果
                next_step(False)

        if current() == self.Second:

            prev_step(False)

            url = get('api-request-url')
            st.write(f'请求地址为：{url}')

            with st.sidebar.expander('控制面板', expanded=True):
                if st.button('重新请求'):
                    unset('api-request-done') 
                    st.rerun()

            if get('api-request-done') is None: # 检查点，如果没有值，则需要请求接口
                try:
                    import requests
                    r = requests.get(url)

                    set('api-request-done', True)
                    set('api-request-response', r)
                    st.rerun()
                except Exception as e:
                    st.error(f'请求失败，请检查地址是否正确，错误信息为：{e}')
            else:
                st.info('请求已经完成')
                r = get('api-request-response')
                st.write(f'请求状态码为：{r.status_code}')
                st.write(f'请求头为：')
                st.json(dict(r.headers))
                st.write(f'请求编码为：{r.encoding}')

                if st.sidebar.checkbox('乱码内容时点击我'):
                    st.code(f'请求内容为:\n {r.content.decode()}')
                else:
                    st.code(f'请求内容为:\n {r.text}')